<template>
</template>

<script>
	
	import BaseExtends from '@/BaseExtends.vue'
	import BaseMixins from '@/BaseMixins.js'
	
	export default {
		extends: BaseExtends,
		mixins: [BaseMixins],
		watch: {
			/**
			 * 项目启动完毕，开始页面初始化
			 * 先子项目完成初始化，再本页面完成初始化
			 */
			"$store.state.isInitial": {
				immediate: true,
				handler(val) {
					if (val) {
						this.subPackagesInitial().then(this.initial).catch(error => {
							this.SysStatus = 'error'
							console.error(error)
						})
					} else {
						this.SysStatus = 'loading'
					}
				}
			},
		},
		data() {
			return {
				/**
				 * 系统页面的加载状态 - CaContain来控制显示
				 * loading：正在加载中
				 * error：加载失败
				 * params：参数错误
				 * noData：没有数据
				 * noAuth：没有权限
				 */
				SysStatus: '',
				// 本页面的加载状态，内容同SysStatus - 部分会被CaContain控制
				loadStatus: '',
				// 页面参数。路由参数里面的数据会被options覆盖，得到这个综合参数
				PageOptions: undefined
			}
		},
		onLoad(options = {}) {
			/**
			 * 处理页面参数
			 * 优先使用options，其次使用路由参数
			 * 路由参数里面的数据会被options覆盖
			 * 其中路由参数会被存起来
			 * 
			 * 如果App是异步执行，这个可能无效，需要再做方案！以确定先后顺序，务必保证页面initial在路由参数获取以及系统初始化完毕之后执行
			 */
			const eventChannel = this.getOpenerEventChannel()
			var noSend = true
			var isApp = false
			// #ifdef APP
			isApp = true // 如果App是异步执行，这个可能无效，需要再做方案
			// #endif
			if (this.core) {
				if (eventChannel && eventChannel.on) {
					eventChannel.on('sendDataToOpenedPage', (routerData) => { // 将路由参数存起来
						noSend = false
						this.callbackOfPage()
						this.core.router.writeRouterData(routerData, this)
						this.PageOptions = Object.assign(options, routerData)
						this.setNavigationBarTitle()
					})
				}
				if (noSend) {
					const routerData = this.core.router.readRouterData(this)
					this.PageOptions = Object.assign(options, routerData)
					this.setNavigationBarTitle()
				}
			}
		},
		methods: {
			// 设置页面标题
			setNavigationBarTitle(title = this.PageOptions.title) {
				if (title) {
					uni.setNavigationBarTitle({title})
				}
			},
			/**
			 * 传递给上个页面的回调。也可以在需要的地方执行
			 * 初步初始化完成。子页面要有什么动作，监听该值为true后执行
			 * 跳转路由的时候，将会执行events.callbackOfPage(data)
			 */
			callbackOfPage(data) {
				const eventChannel = this.getOpenerEventChannel()
				if (eventChannel && eventChannel.emit) {
					eventChannel.emit('callbackOfPage', data)
				}
			},
			// 子项目初始化方法。在具体的子包上面重写
			subPackagesInitial() {
				return new Promise((resolve, reject) => {
					resolve()
				})
			},
			// 本页面的初始化方法。重写该方法即可
			initial() {
				
			},
		}
	}
</script>

<style>
</style>